<?php

namespace app\admin\middleware;

use think\Request;
use think\Response;
use Closure;
use app\admin\model\AdminLog;

class SystemLog
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        $params   = $request->param();

        $method = strtolower($request->method());
        $url    = $request->url();

        if ($request->isAjax()) {
            if (in_array($method, ['post', 'put', 'delete'])) {
                $title = '';

                try {
                    $pathInfo    = $request->pathinfo();
                    $pathInfoExp = explode('/', $pathInfo);
                    $_action     = end($pathInfoExp) ?? '';
                    $pathInfoExp = explode('.', $pathInfoExp[0] ?? '');
                    $_name       = $pathInfoExp[0] ?? '';
                    $_controller = ucfirst($pathInfoExp[1] ?? '');
                    if ($_name && $_controller && $_action) {
                        $className       = "app\admin\controller\\{$_name}\\{$_controller}";
                        $reflectionClass = new \ReflectionClass($className);
                        $properties      = $reflectionClass->getDefaultProperties();
                        $ignoreLog       = $properties['ignoreLog'] ?? [];
                        if (in_array($_action, $ignoreLog)) return $response;
                    }
                }catch (\Throwable $exception) {
                }

                $ip = $request->ip();
                // 限制记录的响应内容，避免过大
                $_response = json_encode($response->getData(), JSON_UNESCAPED_UNICODE);
                $_response = mb_substr($_response, 0, 3000, 'utf-8');

                $data = [
                    'admin_id'    => session('admin.id'),
                    'title'       => $title,
                    'url'         => $url,
                    'method'      => $method,
                    'ip'          => $ip,
                    'content'     => json_encode($params, JSON_UNESCAPED_UNICODE),
                    'response'    => $_response,
                    'useragent'   => $request->server('HTTP_USER_AGENT'),
                    'create_time' => time(),
                ];
                AdminLog::create($data);
            }
        }

        return $response;
    }
}